package com.ruoyi.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.OperationLog;
import com.ruoyi.system.dto.design.OperationLogUpdateDTO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 操作日志 Service 接口
 */
public interface IOperationLogService extends IService<OperationLog> {

    /**
     * 新增操作日志
     *
     * @param operationLog 操作日志实体
     * @return 新增结果（true=成功，false=失败）
     */
    boolean addLog(OperationLog operationLog);

    /**
     * 根据 ID 查询操作日志
     *
     * @param id 日志主键ID
     * @return 操作日志实体（null=未找到）
     */
    OperationLog getLogById(Long id);

    /**
     * 分页查询操作日志（带筛选条件）
     *
     * @param pageNum       页码
     * @param pageSize      每页条数
     * @param businessType  业务类型（可选，如 DESIGN）
     * @param operateUserId 操作人ID（可选）
     * @param startTime     开始时间（可选）
     * @param endTime       结束时间（可选）
     * @return 分页结果
     */
    IPage<OperationLog> getLogPage(
            Integer pageNum,
            Integer pageSize,
            String businessType,
            Long operateUserId,
            LocalDateTime startTime,
            LocalDateTime endTime
    );

    /**
     * 逻辑删除操作日志（根据ID）
     *
     * @param id 日志主键ID
     * @return 删除结果（true=成功，false=失败）
     */
    boolean deleteLogById(Long id);

    /**
     * 根据业务关联ID查询所有操作日志（不分页）
     *
     * @param businessId 业务关联ID（如图纸ID：sj-20251027-001）
     * @return 日志列表
     */
    List<OperationLog> getLogsByBusinessId(String businessId);

    /**
     * 根据业务关联ID查询所有操作日志(同步H5)
     *
     * @param businessId 业务关联ID（如图纸ID：sj-20251027-001）
     * @return 日志列表
     */
    List<OperationLog> getLogsByBusinessIdForH5(String businessId);


    /**
     * 根据业务关联ID和业务类型查询（避免不同模块业务ID重复导致的查询混淆）
     *
     * @param businessId   业务关联ID
     * @param businessType 业务类型（如 DESIGN=图纸设计、ORDER=订单）
     * @return 日志列表
     */
    List<OperationLog> getLogsByBusinessIdAndType(String businessId, String businessType);



    /**
     * 保存操作日志
     * @param log 日志信息
     * @return 是否成功
     */
    boolean saveOperationLog(OperationLog log);

    /**
     * 修改操作日志（仅允许修改非核心字段）
     * @param updateDTO 包含修改信息的DTO
     * @return 操作结果（成功/失败原因）
     */
    AjaxResult updateOperationLog(OperationLogUpdateDTO updateDTO);

    /**
     * 保存物料管理模块操作日志
     */
    void saveMaterialLog(
            Long businessId,
            String businessName,
            Long operatorId,
            String operatorName,
            String operateAction,
            String beforeStatus,
            String afterStatus,
            String remark
    );
}